package com.szlanyou.thirdsdk.retrofit.client;

import android.content.Context;

import com.szlanyou.thirdsdk.retrofit.callback.IHttpResultHandler;
import com.szlanyou.thirdsdk.retrofit.file.download.IHttpDownloadProgressResultHandler;
import com.szlanyou.thirdsdk.retrofit.file.upload.UploadFileWrapper;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Set;

import okhttp3.OkHttpClient;

/**
 * @author 陈章
 * create at 2020/12/22 9:40
 * desc:
 */
public interface IHttpClient extends IClientCommonParamsManage {
    /**
     * 初始化
     * @param mContext
     */
    void init(Context mContext,boolean ... openLog);

    /**
     * 设置base url
     * @param baseUrl
     */
    void setBaseUrl(String baseUrl);

    /**
     * 设置网络请求发起的拦截器,亦可在{@link com.szlanyou.thirdsdk.retrofit.client.HttpClient.RequestBuilder#httpResultHandler(IHttpResultHandler)}中的{@link IHttpResultHandler#onStart(String,String)}方法里实现此功能。
     * @param onRequestInterceptor
     */
    void setOnRequestInterceptor(HttpMaster.OnRequestInterceptor onRequestInterceptor);

    /**
     * 是否自动显示加载对话框
     * @param autoShowLoading
     */
    void setAutoShowLoading(boolean autoShowLoading);

    /**
     * 是否自动显示加载对话框（并指定显示的文案）
     * @param autoShowLoading
     * @param loadingTipTxt
     */
    void setAutoShowLoading(boolean autoShowLoading, String loadingTipTxt);

    /**
     * 网络请求完毕是否自动关闭加载进度框
     *
     * @param autoDismissLoading
     */
    void setAutoDismissLoading(boolean autoDismissLoading);

    /**
     * 手动关闭请求对话框
     */
    void dismissLoading();

    /**
     * 主动取消网络请求 (单个请求)
     *
     * @param requestCodeOut
     */
    void cancel(String requestCodeOut);

    /**
     * 主动取消网络请求 (单个页面)
     *
     * @param requestPageFlag
     */
    void cancelByPageFlag(String requestPageFlag);

    /**
     * 主动取消网络请求 (多个请求)
     * @param requestCodeSet
     */
    void cancel(Set<String> requestCodeSet);

    /**
     * 取消所有的网络请求
     */
    void cancelAll();

    /**
     * 个性化设置
     * @param builder
     *
     * 可以在此处设置网络超时时间参数、添加拦截器等
     */
    void onCustomSettings(OkHttpClient.Builder builder);

    /**
     * 获取服务
     * 为什么还要封装方法来获取Service，因为当前的框架只支持异步请求，有些网络请求必须是
     * 同步的(如refresh_token)，所以需要暴露一个这样的接口。
     * @param serviceClass
     * @param <T>
     * @return
     */
    <T> T getService(Class<T> serviceClass);
}
